/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "pch.h"
#include "节点全局数据.h"





std::vector<S_MapPtrItem> S_节点数据::g_物体节点树;
std::vector<S_MapPtrItem> S_节点数据::g_几何节点树;
std::vector<S_MapPtrItem> S_节点数据::g_渲染节点树;
std::vector<S_MapPtrItem> S_节点数据::g_函数节点树;
std::vector<S_MapPtrItem> S_节点数据::g_材质节点树;
std::vector<S_MapPtrItem> S_节点数据::g_着色节点树;
std::vector<S_MapPtrItem> S_节点数据::g_物理节点树;
std::vector<S_MapPtrItem> S_节点数据::g_包节点树;


std::vector<std::vector<S_MapPtrItem>*> S_节点数据::g_节点树容器 = {
	&S_节点数据::g_物体节点树,
	&S_节点数据::g_几何节点树,
	&S_节点数据::g_渲染节点树,
	&S_节点数据::g_函数节点树,
	&S_节点数据::g_材质节点树,
	&S_节点数据::g_着色节点树,
	&S_节点数据::g_包节点树,
};


std::vector<S_MapPtrItem> S_节点数据::g_渲染输出纹理;
std::vector<S_MapPtrItem> S_节点数据::g_素材纹理;

std::vector<std::vector<S_MapPtrItem>*> S_节点数据::g_纹理预览容器 = {
	&S_节点数据::g_渲染输出纹理,
	&S_节点数据::g_素材纹理,
};



std::vector<C_节点树*> S_节点数据::g_根节点树;
std::vector<C_节点树*> S_节点数据::g_渲染根节点树;

C_节点树* S_节点数据::G当前包节点树 = nullptr;
C_节点树* S_节点数据::G当前物体节点树 = nullptr;
C_节点树* S_节点数据::G当前材质节点树 = nullptr;
C_节点树* S_节点数据::G当前着色节点树 = nullptr;
C_节点树* S_节点数据::G当前渲染节点树 = nullptr;
C_节点树* S_节点数据::G当前并行节点树 = nullptr;

bool      S_节点数据::g_开启节点帧更新 = false;
bool      S_节点数据::g_开启节点手动更新 = false;
bool      S_节点数据::g_开启离线更新 = false;

//S_Mesh* S_节点数据::g_me_包围盒网格 = nullptr;
S_Mesh* S_节点数据::g_me_摄像机锥形 = nullptr;
S_Mesh* S_节点数据::g_me_铰链轴 = nullptr;
S_Mesh* S_节点数据::g_me_立方体 = nullptr;
S_Mesh* S_节点数据::g_me_圆柱体 = nullptr;
S_Mesh* S_节点数据::g_me_球体 = nullptr;
S_Mesh* S_节点数据::g_me_平面 = nullptr;
S_Mesh* S_节点数据::g_me_胶囊 = nullptr;
S_Mesh* S_节点数据::g_me_链接线 = nullptr;
S_Mesh* S_节点数据::g_me_灯光圆 = nullptr;
S_Mesh* S_节点数据::g_me_灯光平行线 = nullptr;
S_Mesh* S_节点数据::g_me_区域光四边线 = nullptr;
S_Mesh* S_节点数据::g_me_四边型 = nullptr;
S_Mesh* S_节点数据::g_me_十字叉 = nullptr;
S_Mesh* S_节点数据::g_me_范围圆 = nullptr;
S_Mesh* S_节点数据::g_me_胶囊封套端 = nullptr;
S_Mesh* S_节点数据::g_me_胶囊封套管 = nullptr;
S_Mesh* S_节点数据::g_me_边界框 = nullptr;

S_Mesh* S_节点数据::g_me_虚拟体_X箭头 = nullptr;
S_Mesh* S_节点数据::g_me_虚拟体_Y箭头 = nullptr;
S_Mesh* S_节点数据::g_me_虚拟体_Z箭头 = nullptr;
S_Mesh* S_节点数据::g_me_虚拟体_X旋转箭头 = nullptr;
S_Mesh* S_节点数据::g_me_虚拟体_Y旋转箭头 = nullptr;
S_Mesh* S_节点数据::g_me_虚拟体_Z旋转箭头 = nullptr;


S_Mesh* S_节点数据::g_me_物理体_立方体 = nullptr;
S_Mesh* S_节点数据::g_me_物理体_圆柱体 = nullptr;
S_Mesh* S_节点数据::g_me_物理体_球体 = nullptr;
S_Mesh* S_节点数据::g_me_物理体_平面 = nullptr;
S_Mesh* S_节点数据::g_me_物理体_胶囊 = nullptr;


bool	S_节点数据::g_开启节点更新 = true;

S_字体 S_节点数据::g_字体_小 = {};



std::map<std::u16string, E_值类型> S_节点数据::g_值类型名称映射 = {
	{u"i8",		E_值类型::e_Type_I8},
	{u"i32",	E_值类型::e_Type_I32},
	{u"ui32",	E_值类型::e_Type_UI32},
	{u"f32",	E_值类型::e_Type_F32},
	{u"f64",	E_值类型::e_Type_F64},
	{u"uvec2",	E_值类型::e_Type_uVec2},
	{u"vec2",	E_值类型::e_Type_Vec2},
	{u"vec3",	E_值类型::e_Type_Vec3},
	{u"vec4",	E_值类型::e_Type_Vec4},
	{u"ivec3",	E_值类型::e_Type_iVec3},
	{u"uvec3",	E_值类型::e_Type_uVec3},
	{u"mat44",	E_值类型::e_Type_Mat4X4},

	{u"[ I8 ]",    E_值类型::e_Type_I8_1D},
	{u"[ I32 ]",   E_值类型::e_Type_I32_1D},
	{u"[ UI32 ]",   E_值类型::e_Type_UI32_1D},
	{u"[ F32 ]",   E_值类型::e_Type_F32_1D},
	{u"[ vec2 ]",  E_值类型::e_Type_Vec2_1D},
	{u"[ vec3 ]",  E_值类型::e_Type_Vec3_1D},
	{u"[ vec4 ]",	 E_值类型::e_Type_Vec4_1D},
	{u"[ ivec2 ]", E_值类型::e_Type_iVec2_1D},
	{u"[ ivec3 ]", E_值类型::e_Type_iVec3_1D},
	{u"[ mat44 ]", E_值类型::e_Type_Mat4X4_1D},

	{u"[ [UI32] ]",E_值类型::e_Type_UI32_2D},
	{u"[ [vec3] ]", E_值类型::e_Type_Vec3_2D},
	{u"[ [ivec3] ]", E_值类型::e_Type_iVec3_2D},

	{u"edge",     E_值类型::e_Type_多边形边},
	{u"[edge]",   E_值类型::e_Type_多边形边1D},
	{u"多边形",   E_值类型::e_Type_多边形},
	{u"[多边形]", E_值类型::e_Type_多边形_1D},

	{u"Mesh",	E_值类型::e_Type_Mesh},
	{u"[ Mesh ]",	E_值类型::e_Type_Mesh_1D},
	//{u"[tex]",	E_值类型::e_Type_纹理},
	{u"Ob",     E_值类型::e_Type_Object},
	{u"[Ob]",	E_值类型::e_Type_Object_1D},

	{u"多边形元素",	    E_值类型::e_Type_多边形元素},
	{u"[多边形元素]",   E_值类型::e_Type_多边形元素1D},

	{u"纹理",           E_值类型::e_Type_纹理},
	{u"[纹理]",         E_值类型::e_Type_纹理_1D},

	{u"材质",           E_值类型::e_Type_材质},
	{u"[材质]",         E_值类型::e_Type_材质1D},

	{u"字体",           E_值类型::e_Type_字体},

	{u"字符串",         E_值类型::e_Type_Str},
	{u"[字符串]",       E_值类型::e_Type_LineStr1D},

	{u"包围盒",         E_值类型::e_Type_Bounding},
	{u"[包围盒]",       E_值类型::e_Type_Bounding_1D},

	{u"网格自定义属性",       E_值类型::e_Type_网格自定义属性},
};


//C_StrKey分配器	S_节点数据::g_纹理对象名称分配器;
C_StrKey分配器	S_节点数据::g_节点树名称分配器;
C_Key分配器		S_节点数据::g_着色器ID分配器;

C_Key分配器		S_节点数据::G_平行光ID;
C_Key分配器		S_节点数据::G_点光源ID;
C_Key分配器		S_节点数据::G_区域光ID;
C_Key分配器		S_节点数据::G_聚光灯ID;


S_摄像机* S_节点数据::g_当前操作视口相机 = nullptr;
S_Props		S_节点数据::g_物理引擎视口互交 = f_alloc_BoolProp(nullptr, u"视口互交");
vec3		S_节点数据::g_视口鼠标点射线[2] = { {},{} };
S_施加物理力 S_节点数据::g_施加力 = { {}, {},{}, -1 };



std::string	S_节点数据::g_工程文件节点代码路径;
std::string	S_节点数据::g_工程文件几何节点代码绝对路径;
std::string	S_节点数据::g_工程文件函数节点代码绝对路径;
std::string	S_节点数据::g_工程文件材质节点代码绝对路径;
std::string	S_节点数据::g_工程文件着色节点代码绝对路径;

std::string	S_节点数据::g_编译器路径 = "compiled/";

std::map<std::u16string, C_节点树*> S_节点数据::G用于重新映射节点树到节点的容器;
std::map<std::u16string, C_节点基类*> S_节点数据::G全局节点;



S_物体* S_节点数据::g_激活物体 = nullptr;

//std::set<S_物体*>	S_节点数据::g_选中物体;
std::set<S_物体*>	S_节点数据::g_编辑物体;
std::set<S_物体*>	S_节点数据::g_辅助编辑物体;

std::set<S_物体*>	S_节点数据::m_全局物体set;
std::set<S_物体*>	S_节点数据::m_独立物体set;


//S_物体* S_节点数据::m_包围盒物体 = nullptr;

//C_StrKey分配器								S_节点数据::g_物体名称分配器;
//std::unordered_map<std::u16string, S_Object*> S_节点数据::g_全局索引物体;

C_StrKey分配器								S_节点数据::g_渲染世界名称分配器;
std::map<std::u16string, S_Object*>			S_节点数据::g_渲染世界数据;

C_StrKey分配器								S_节点数据::g_渲染层名称分配器;
std::map<std::u16string, S_Object*>			S_节点数据::g_渲染层数据;

C_Key分配器	S_节点数据::g_渲染层ID生成器;
S_Object*	S_节点数据::g_渲染层大纲数据 = nullptr;




int32			S_节点数据::g_物体全局渲染模式 = 0;
uint32			S_节点数据::g_物体全局显示模式 = 3;
S_Prop枚举项* S_节点数据::g_物体显示模式项_光追 = nullptr;
S_Prop枚举项* S_节点数据::g_对称轴枚举项 = nullptr;
S_Prop枚举项* S_节点数据::g_图像文件后缀 = nullptr;
S_Prop枚举项* S_节点数据::g_视频文件后缀 = nullptr;
S_Prop枚举项* S_节点数据::g_片源着色器类型项 = nullptr;
S_Prop枚举项* S_节点数据::g_粒子包含属性 = nullptr;


int32 S_节点数据::g_渲染帧编号 = 0;


S_GPU内存块	S_节点数据::g_小字体纹理UV = {};
//S_纹理采样器*	S_节点数据::g_渲染纹理采样器 = nullptr;
S_纹理* S_节点数据::g_渲染器默认纹理 = nullptr;
S_纹理* S_节点数据::g_缺损环境颜色纹理 = nullptr;
S_纹理* S_节点数据::g_缺损环境深度纹理 = nullptr;
//S_纹理* S_节点数据::g_缺损阴影纹理 = nullptr;
//S_纹理* S_节点数据::g_缺损立方体阴影纹理 = nullptr;


S_GPU计算* S_节点数据::g毛笔笔刷_计算环境 = nullptr;
S_GPU计算* S_节点数据::g单色纹理笔刷_计算环境 = nullptr;


std::set<S_Physics*>	S_节点数据::g_物理引擎;
std::string S_节点数据::g流体缓存类型名称 = ".bpfcache";
std::string S_节点数据::g流体缓存帧ID = ".FID";






//============================================== 材质 =================================================

S_材质管线* S_节点数据::g_基本光照描边材质 = nullptr;
S_材质管线* S_节点数据::g_基本光照轮廓材质 = nullptr;
S_材质管线* S_节点数据::g_逐顶点线段描边材质 = nullptr;
S_材质管线* S_节点数据::g_基本光照平面材质 = nullptr;

S_材质管线* S_节点数据::g_权重可视线材质 = nullptr;
S_材质管线* S_节点数据::g_权重可视面材质 = nullptr;
S_材质管线* S_节点数据::g_索引绘制_颜色线段材质 = nullptr;
S_材质管线* S_节点数据::g_索引绘制_颜色线材质 = nullptr;
S_材质管线* S_节点数据::g_索引绘制_颜色点材质 = nullptr;

S_材质管线* S_节点数据::g_索引绘制_图标材质 = nullptr;

S_材质管线* S_节点数据::g_单色点材质 = nullptr;
S_材质管线* S_节点数据::g_单色平直面材质 = nullptr;
S_材质管线* S_节点数据::g_单色面材质 = nullptr;
S_材质管线* S_节点数据::g_单色线框材质 = nullptr;
S_材质管线* S_节点数据::g_单色描边材质 = nullptr;
S_材质管线* S_节点数据::g_单色线段材质 = nullptr;
S_材质管线* S_节点数据::g_单色连续线材质 = nullptr;

S_材质管线* S_节点数据::g_单色连续虚线材质 = nullptr;
S_材质管线* S_节点数据::g_单色线段虚线材质 = nullptr;

S_材质管线* S_节点数据::g逐顶点线段材质 = nullptr;
S_材质管线* S_节点数据::g逐顶点线段材质_朝向镜头 = nullptr;
S_材质管线* S_节点数据::g逐顶点连续线材质 = nullptr;
S_材质管线* S_节点数据::g逐顶点_点材质 = nullptr;

S_材质管线* S_节点数据::g曲线材质 = nullptr;
S_材质管线* S_节点数据::g曲线控制点材质 = nullptr;
S_材质管线* S_节点数据::g曲线控制线材质 = nullptr;

S_材质管线* S_节点数据::g数值标注材质 = nullptr;
S_材质管线* S_节点数据::g数值标注线材质 = nullptr;
S_材质管线* S_节点数据::g包围盒材质 = nullptr;
S_材质管线* S_节点数据::g_AABB材质 = nullptr;

S_材质管线* S_节点数据::gFLIP可视预览材质 = nullptr;
S_材质管线* S_节点数据::g物理光照轮廓材质 = nullptr;
S_材质管线* S_节点数据::g物理光照线材质 = nullptr;


S_板载缓存* S_节点数据::g_节点渲染摄像机矩阵 = nullptr;
S_纹理采样器* S_节点数据::g_场景渲染纹理采样器 = nullptr;


S_纹理采样器*		S_节点数据::g_字体纹理采样器 = nullptr;

S_时间帧			S_节点数据::g_场景帧 = { 0, {0, 200}, 1, 25 };
std::stack<S_物体*>	S_节点数据::g_删除物体;



std::map<std::u16string, std::vector<class C_扩展节点*>> S_节点数据::g扩展节点库;


std::map<std::u16string, S_插件*>	S_节点数据::g插件库;
C_StrKey分配器						S_节点数据::g库名称分配器;

std::map<std::u16string, void*> S_节点数据::g扩展节点参数;




S_Prop枚举项* S_节点UI数据::g_对称轴枚举项 = nullptr;
S_Prop枚举项* S_节点UI数据::g_物理可视项 = nullptr;
std::vector<S_标题和图标> S_节点UI数据::g_物体显示模式标题和图标 = {
			{u"边框",	u"模型边框"},
			{u"面",		u"模型面"},
			{u"边",		u"模型边"},
			{u"焦点",	u"模型轮廓"},

			{u"光照",	u"删除"},
			{u"纹理",	u"删除"},
			{u"轮廓",	u"删除"},
			{u"边线",	u"删除"},

			{u"点",		u"模型点"},

			{u"预览",	u"视口预览"},
			{u"渲染",	u"模型渲染"}
};

std::vector<S_标题和图标> S_节点UI数据::g_视口显示模式标题和图标 = {
			{u"白模",	u"删除"},
			{u"纹理",	u"模型面"},
			{u"光栅",	u"视口预览"},
};

std::vector<S_标题和图标> S_节点UI数据::g_视口显示模式标题和图标_光追 = {
			{u"白模",	u"删除"},
			{u"纹理",	u"模型面"},
			{u"光栅",	u"视口预览"},
			{u"光追",	u"模型渲染"}
};





S_VkDrawIndexedIndirectCommand S_虚拟体ID偏移::Indirect_交叉轴 = {};
S_VkDrawIndexedIndirectCommand S_虚拟体ID偏移::Indirect_方向轴 = {};
S_VkDrawIndexedIndirectCommand S_虚拟体ID偏移::Indirect_线框球 = {};






vec3 S_射线拾取参数::g相机位置 = {};
vec3 S_射线拾取参数::g开始射线 = {};
vec3 S_射线拾取参数::g结束射线 = {};
vec3 S_射线拾取参数::g手柄初始变换 = {};
vec3 S_射线拾取参数::g垂足坐标 = {};
vec3 S_射线拾取参数::g垂直线向量 = {};
vec3 S_射线拾取参数::g交点S = {};
vec3 S_射线拾取参数::g交点E = {};
float32 S_射线拾取参数::g垂直线长度 = 0;
float32 S_射线拾取参数::g开始交点距离 = 0;
float32 S_射线拾取参数::g结束交点距离 = 0;




S_Props	S_节点数据状态::g_是否打开了编辑模式 = {};
S_Props S_节点数据状态::g_网格编辑模式 = {};
S_Props S_节点数据状态::g_骨架编辑模式 = {};
S_Props S_节点数据状态::g_灯光编辑模式 = {};
S_Props S_节点数据状态::g_骨骼编辑模式 = {};
S_Props S_节点数据状态::g_骨骼姿态编辑模式 = {};
S_Props S_节点数据状态::g_3D视口显示模式 = {};


bool	S_NodeCtx_模拟计算::g_结束模拟解算 = false;
bool	S_NodeCtx_模拟计算::g_是否更新节点 = true;
S_Props	S_NodeCtx_模拟计算::g_是否开启解算 = f_alloc_BoolProp(nullptr, u"是否开启模拟计算");
S_Props	S_NodeCtx_模拟计算::g_节点解算 = f_alloc_BoolProp(nullptr, u"是否开启解算");




S_设备环境		S_节点框架::ctx;
S_设备			S_节点框架::GPU;
S_设备环境*		S_节点框架::g_3D视口环境 = nullptr;
S_设备环境*		S_节点框架::g_UI视口环境 = nullptr;
S_设备环境*		S_节点框架::g_UI合成环境 = nullptr;
C_Widget管理*	S_节点框架::g_UIGM = nullptr;






S_节点数据::S_节点数据() {
}
